package com.ruoyi.aitcommon.utils;

import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import cn.hutool.core.io.FileUtil;
import org.apache.commons.io.FilenameUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter;

/**
 * 文件工具类封装
 * @author Administrator
 *
 */
public class FileUtils {
	public static String getMainName(String path) {
		return FileNameUtil.mainName(path);
	}
	public static String getExtName(String path) {
		return FileNameUtil.extName(path);
	}
	public static String getFullPath(String path) {
//		使用 org.apache.commons 工具类
		return FilenameUtils.getFullPath(path);
	}
	/**
	 * 绝对路径读取外部,相对路径读取classpath下
	 * @param path
	 * @return
	 */
	public static String readFileLines(String path) {
		//这里new file,确保使用相对路径,而不是class路径
		File file=new File(path);
//		使用hutool工具类
		FileReader reader=new FileReader(file);
		LogUtils.info("读取文件成功,文件:" + file.getAbsolutePath());
		return reader.readString();
	}
	/**
	 * 读取文件指定行数,从文件尾部倒数
	 * @param path 文件路径
	 * @param num 倒数行数
	 * @return
	 */
	public static String readFileLines(String path, int num, Charset charset) {
		//这里new file,确保使用相对路径,而不是class路径
		File file=new File(path);
		if(charset==null) charset= StandardCharsets.UTF_8;
		FileReader reader=new FileReader(file,charset);
		List<String> lines = reader.readLines();
		List<String> retlines=new ArrayList<>();
		
		int start=lines.size()-num>0?lines.size()-num:0;
		for(int i=start;i<lines.size();i++) {
			retlines.add(lines.get(i));
		}
		
//		处理返回
		LogUtils.info("读取文件成功,文件:" + file.getAbsolutePath());
		StringBuilder sb = new StringBuilder();
		for(String line:retlines) {
			sb.append(line+"\r\n");
		}
		return sb.toString();
	}
	
	/**
	 * 读取文件,输入是文件流,主要用于读取classpath内文件
	 * @param input
	 * @return
	 */
	public static String readFileLines(InputStream input) throws Exception {
		BufferedReader reader = null;
		StringBuilder sb = new StringBuilder();
		try {
//			读取UTF-8的文件格式
			reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
			String line = "";
			while ((line = reader.readLine()) != null) {
				sb.append(line + "\r\n");
			}
			reader.close();
		} catch (Exception ex) {
			throw new Exception(ex);
		} finally {
			if (reader != null) {
				reader.close();
			}
		}
		return sb.toString();
	}
	/**
	 * 写文件,使用UTF-8编码
	 * @param filePath 文件路径,可以是相对路径
	 * @param text 文件内容
	 * @return
	 */
	public static File writeFile(String filePath, String text) {
		//这里new file,确保使用相对路径,而不是class路径
		File file=new File(filePath);
//		使用hutool工具类
//		该方法会自动创建目录和文件
//		支持\和/文件路径
		FileWriter writer=new FileWriter(file);
		writer.write(text);
		LogUtils.info("写入文件成功,文件:" + file.getAbsolutePath());
		return file;
	}

	/**
	 * 写文件,使用UTF-8编码
	 * @param filePath 文件路径,可以是相对路径
	 * @param inputStream 文件内容
	 * @return
	 */
	public static File writeFile(String filePath, InputStream inputStream) {
		//这里new file,确保使用相对路径,而不是class路径
		File file=new File(filePath);
		FileWriter writer=new FileWriter(file);
		writer.writeFromStream(inputStream);
		LogUtils.info("写入文件成功,文件:" + file.getAbsolutePath());
		return file;
	}

	public static String readFromStream(InputStream inputStream) throws IOException {
		StringBuilder result = new StringBuilder();
		try (BufferedReader reader = new BufferedReader(
				new InputStreamReader(inputStream, "UTF-8"))) {
			String line;
			while ((line = reader.readLine()) != null) {
				result.append(line).append("\n");
			}
		}
		return result.toString();
	}

	/**
	 * 优先读取外部文件,否则读取包内资源文件
	 * @param pathfile 文件路径,可以是相对路径
	 * @return 文件字符串,自带\r\n
	 */
	public static String getResourceFile(String pathfile) throws Exception {
		InputStream in = null;
		File file = new File(pathfile);

		if (file.exists()) {
//			优先读取外部文件
			in = new FileInputStream(file);
		} else {
//			否则读取包内部文件
			ClassLoader classLoader = FileUtils.class.getClassLoader();
			in = classLoader.getResourceAsStream(pathfile);
		}
		if (in == null)
			throw new Exception("获取资源文件失败,文件:" + pathfile);
		String lines = readFileLines(in);
		return lines;
	}
	
	/**
	 * 获取目录下的所有文件,支持下级目录
	 * @param dir 目录
	 * @return 目录下的文件路径Path,绝对路径
	 */
	public static List<String> getFileList(String dir){
		List<String> retlist = new ArrayList<>();

		File dirfile = new File(dir);
		if (!dirfile.exists() || !dirfile.isDirectory()) {// 判断是否存在目录
			return null;
		}
		File[] listFiles = dirfile.listFiles();// 读取目录下的所有文件和子目录
		for (File file : listFiles) {
			if(file.isDirectory()){
				final String path = file.getPath();
				final List<String> fileList = getFileList(path);
				retlist.addAll(fileList);
			}else{
				retlist.add(file.getAbsolutePath());
			}
		}
		return retlist;
	}

	/**
	 * 读取当前目录下的文件
	 * 这个目录是外部目录,不是classpath下的
	 * @param dir 当前目录
	 * @return 文件绝对路径
	 */
	private static List<String> findFileList(String dir, String pattern) {
		File dirfile = new File(dir);
		if (!dirfile.exists() || !dirfile.isDirectory()) {// 判断是否存在目录
			return null;
		}
		File[] listFiles = dirfile.listFiles();// 读取目录下的所有目录文件信息
		List<File> flist = filterFile(listFiles, pattern);
		List<String> retlist = new ArrayList<String>();
		for (File file : flist) {
			retlist.add(file.getAbsolutePath());
		}
		return retlist;
	}

	/**
	 * 文件名过滤,支持通配符
	 * @param listFiles 文件列表
	 * @param pattern 正则表达式,匹配文件
	 * @return
	 */
	private static List<File> filterFile(File[] listFiles, String pattern) {
		if(listFiles==null) return null;
		String regex = pattern + "";
		regex = regex.replace('.', '#');
		regex = regex.replaceAll("#", "\\\\.");
		regex = regex.replace('*', '#');
		regex = regex.replaceAll("#", ".*");
		regex = regex.replace('?', '#');
		regex = regex.replaceAll("#", ".?");
		regex = "^" + regex + "$";

		Pattern pat = Pattern.compile(regex);
		List<File> retlist = new ArrayList<File>();

		for (File file : listFiles) {
			if (file.isDirectory())
				continue;
			Matcher matcher = pat.matcher(file.getName());
			if (matcher.matches())
				retlist.add(file);
		}
		return retlist;
	}

	public static void main(String[] args) throws Exception {

	}
}